package com.rem.hutool.my4IO;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.watch.SimpleWatcher;
import cn.hutool.core.io.watch.WatchMonitor;
import cn.hutool.core.io.watch.Watcher;
import cn.hutool.core.lang.Console;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.WatchEvent;

/**
 * 文件监听
 * 监听文件状态以及内容的改变
 * 支持多级目录的监听（WatchService只支持一级目录），可自定义监听目录深度
 * 延迟合并触发支持（文件变动时可能触发多次modify，支持在某个时间范围内的多次修改事件合并为一个修改事件）
 * 简洁易懂的API方法，一个方法即可搞定监听，无需理解复杂的监听注册机制。
 * 多观察者实现，可以根据业务实现多个Watcher来响应同一个事件（通过WatcherChain）
 *
 * @author Rem
 * @date 2020-08-20
 */

public class WatchMonitorDemo {

    public static void main(String[] args) {
        File file = FileUtil.file("../../src/main/resources/static");
        //这里只监听文件或目录的修改事件
        WatchMonitor.createAll(file, new SimpleWatcher() {
            @Override
            public void onModify(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("event :", currentPath, obj);
            }
        }).start();


        //watchUpdate();

    }

    private static void watchUpdate() {
        File file = FileUtil.file("../../src/main/resources/static");
        //这里只监听文件或目录的修改事件
        WatchMonitor watchMonitor = WatchMonitor.create(file, WatchMonitor.ENTRY_MODIFY);
        watchMonitor.setWatcher(new Watcher() {

            @Override
            public void onCreate(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("创建：{}-> {}", currentPath, obj);
            }

            @Override
            public void onModify(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("修改：{}-> {}", currentPath, obj);
            }

            @Override
            public void onDelete(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("删除：{}-> {}", currentPath, obj);
            }

            @Override
            public void onOverflow(WatchEvent<?> event, Path currentPath) {
                Object obj = event.context();
                Console.log("Overflow：{}-> {}", currentPath, obj);
            }
        });

        //设置监听目录的最大深入，目录层级大于制定层级的变更将不被监听，默认只监听当前层级目录
        watchMonitor.setMaxDepth(3);
        //启动监听
        watchMonitor.start();
    }


}
